package com.base.spring.security.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        // 根据您的数据库配置返回 DataSource 实例
        // 例如，使用 HikariCP 连接池
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/spring_security");
        dataSource.setUsername("root");
        dataSource.setPassword("lebron361");

        // 可以添加更多配置，例如连接池大小、初始化大小、最大等待时间等
        dataSource.setInitialSize(5); // 初始连接数
        dataSource.setMinIdle(5); // 最小空闲连接数
        dataSource.setMaxActive(20); // 最大连接数
        dataSource.setMaxWait(60000); // 配置获取连接等待超时的时间，单位毫秒

        // 配置间隔多久进行一次检测，检测需要关闭的空闲连接，单位是毫秒
        dataSource.setTimeBetweenEvictionRunsMillis(60000);
        // 配置一个连接在池中最小生存的时间，单位是毫秒
        dataSource.setMinEvictableIdleTimeMillis(300000);

        // 验证连接是否有效，使用的SQL语句8
        dataSource.setValidationQuery("SELECT 1");
        // 指明连接是否被空闲连接回收器(如果有)进行检验，如果检测失败，则连接将被从池中去除
        dataSource.setTestWhileIdle(true);
        // 借出连接时是否测试，如果为true，则每次从池中取连接时都会测试
        dataSource.setTestOnBorrow(false);
        // 归还连接时是否测试，如果为true，则每次归还连接到池中时都会测试
        dataSource.setTestOnReturn(false);

        // 打开PSCache，并且指定每个连接上PSCache的大小
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);

        // 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙

        // 通过connectProperties属性来打开mergeSql功能；慢SQL记录
        dataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");

        return dataSource;
    }
}
